package com.lcn.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;

/**
 * 记录业务耗时日志的切片类
 */
@Component
@Slf4j
@Aspect
public class ServiceLogAspect {

    /**
     * 第一个* 任何返回值
     * com.lcn.service.impl.. 该包以及该包的子包
     * 第二个* 任意类
     * 第三个* 任意方法
     * (..) 任意参数
     */
    @Around("execution(* com.lcn.service.impl..*.*(..))")
    public Object recordTimeLog(ProceedingJoinPoint joinPoint) throws Throwable {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        Object proceed = joinPoint.proceed(); // 执行的方法
        stopWatch.stop();
        long costTime = stopWatch.getTotalTimeMillis();
        // 获取切点名称
        String pointName = joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName();
        if (costTime > 3000) {
            log.error("{}非常耗时: {}ms", pointName, costTime);
        } else if (costTime > 1000) {
            log.info("{}稍微耗时: {}ms", pointName, costTime);
        } else {
            log.info("{}正常耗时: {}ms", pointName, costTime);
        }
        return proceed;
    }

}
